/**
 * @brief 过滤器基础接口定义
 * @version 1.0
 * @date
 * @author 宋炜
 */
#ifndef FILTERIO_H
#define FILTERIO_H

#include <vector>
#include <atomic>
#include <string>
#include <iostream>

#include "defines.hpp"
#include "filter.hpp"


class filterIO
{
public:
	enum io_type{ head,  tail, mid };

	enum err_code{
		ERR_BASE = ERR_FILTER,				// -7000
		ERR_GET_SYSVAR,                       // 读取系统变量失败
		ERR_ALLOC_MEM,                      // 内存分配失败
		ERR_SERIAL_FD,                      // 串口文件描述符错误
		ERR_RESOLVE_DNS,                    // 域名解析错误
		ERR_MQTT_ALREADY_CONNECTED,         // MQTT 已经连接
		// Http
		ERR_CURL_CTX_NULL,                  // CURL 上下文指针为空
		ERR_CURL_FAIL,                      // CURL 操作失败
		ERR_UDP_RECV_NULL,                  // UDP 接收数据空
		ERR_UDP_NOT_INIT,                   // UDP 没有初始化
		ERR_UNKNOWN,                        // 不明错误
		ERR_SYS,                            // 操作系统错误
		// 以下定义AT指令操作返回的错误代码
		ERR_BAD_LINE    = 1000,             // 通讯链路失败
		ERR_BAD_BAUD,                       // 波特率错误
		ERR_CONN_FAIL,                      // 连接失败
		ERR_CAN_NOT_FIND_HELP_FILE ,        // 找不到AT指令帮助文件
		ERR_CAN_NOT_SYS_VAR,                // 无法获取系统变量
		ERR_UNSUPPORTED_STOP,               // 不支持的的停止位
		ERR_UNSUPPORTED_PARITY,             // 不支持的校验位
		ERR_UNSUPPORTED_FLOW,               // 不支持的流控位
		ERR_UNSUPPORTED_BAUD,
		ERR_UNSUPPORTED_CHAR_LEN,
		ERR_SYS_ERROR,
		ERR_REQ_CSQ,                        // 读取CSQ失败
		ERR_GET_SYSINFO,                    // 读取系统信息失败
		ERR_GPS_NOT_INIT,					// GPS 没有初始化
		ERR_BAD_SMS_OBJ,                    // 短信句柄没有初始化
		ERR_SMS_SEND_FAIL,                  // 短信发送失败
		ERR_SET_SN,                         // 设置SN失败
		ERR_SET_SN_SAVE,                    // 保存SN数据失败
		ERR_SET_SN_COPY,                    // 保存SN默认备份失败
		ERR_BAD_PASWD   = 2000,             // 指令密码错误
		ERR_UNSUPORTED_INST,                // 指令不支持
		ERR_HANDSHAKE_OVERTIME,             // 握手超时
		ERR_MISSING_SIM_CARD,               //
		ERR_SIM_BUSY,
		ERR_SIM_BLOCKED,                    // sim卡被锁定
		ERR_UNKNOW_SIM_STATE,               // sim状态不确定
		ERR_BAD_PACK_INTVAL,                // 串口打包间隔时间错误
		ERR_BAD_PACK_LENGTH,                // 串口打包长度错误
		ERR_MISS_CR     = 3000,             // 缺少结束符号 CR
		ERR_MISS_EQ,                        // 指令缺少=
		ERR_MISS_COMMA,                     // 指令缺少,
		ERR_MISS_QUOTA,                     // 指令缺少“
		ERR_QUOTA_UNPAIRED,                 // ”不配对
		ERR_ENUM_FAULT,                     // 枚举类型不支持
		ERR_DEC,                            // 错误的10进制数据
		ERR_BAD_PARAM,                      // 参数错误
		ERR_BAD_GRAMMA,                     // 语法错误
		ERR_BAD_ENUM_VALUE,                 // 枚举类型的数值选择项错误
		ERR_LINK_TYPE,                      // TCP 链接类型错误
		ERR_BAD_AT_START,
		ERR_UNSPORTED_HTP_MTD,              // 不支持HTTP操作方式
		ERR_SET_APN,						// 设置APN接入点失败
		ERR_ILLEGAL_MB_MISSION_DESC,        // MODBUS 任务描述无效
		ERR_MODBUS_OPERATION,               // modbus 操作类型错误
		ERR_MODBUS_PATH_EMPTY,              // modbus 任务文件路径空
		ERR_MODBUS_PATH,                    // modbus 任务文件错误
		ERR_CONN_TIME_OFR,                  // 连接超时时间错误
		ERR_BAD_ROOT_PSWD,                  // 超级用户密码错误
		ERR_BAD_ROOT_STATUS,                // 用户没有操作权限
		ERR_BAD_UPGRADE_PASWD,              // 升级操作密码错误
		ERR_BAD_UPGRADE_ENGINE,             // 升级操作模块错误
		OK = 0
    	};
    	typedef std::vector< filterList * >    afilterlist_t;

protected:
	afilterlist_t              ptList;   // 对于中间部分的IO类型，不需要这个参数；对于头部则需要
	std::string                m_name;   //
	std::atomic< io_type >     m_type;   // IO类型
public:
	filterIO( io_type ht , filterList* list = nullptr );
	virtual ~filterIO();
	/**
	 * @brief 在头和尾类型的IO中会当IO上发生接收数据的时候会调用这个函数
	 *     在中间类型的IO中这个函数没有意义
	 * @param len ， 数据长度
	 * @param data ， 数据指针
	 * @param err ， err操作状态，错误为小于0的数，否则为0。具体错误描述查看相关代码
	 */
	void OnRecv( size_t len , const char * data , err_code err );
	/**
	 * @brief 在OnRecv中调用或者在，filterList对象的Run中调用
	 * @param it , 列表中的迭代器，通过这个迭代器获取下一个filterIO对象
	 * @param len , 数据长度
	 * @param data ， 数据指针
	 * @param err ， 状态代码，没有错误的时候为OK（0）
	 * @return 操作成功返回true , 否则返回false
	 */
	bool forward( filterList::iterator it , size_t len , const char * data , err_code err );
	bool backward( auto it , size_t len , const char * data , err_code err );

	void type( io_type t ){ m_type = t; }
	io_type type(){ return m_type; }
	/**
	 * @brief 添加过滤器链
	 * @param l
	 */
	void addlist( filterList * l )
	{
		ptList.push_back( l );
	//        std::cout << "PtList size: " << ptList.size() << std::endl;
	}
	/**
	 * @brief 移除过滤器
	 * @param it
	 */
	void removelist( afilterlist_t::iterator it ){ ptList.erase( it ); }
	virtual bool is_connected(){return true; }
protected:
	/**
	 * @brief 实际执行过滤处理的操作函数。在各种不同应用的过滤器中实现。
	 * @note 参数rd在函数内部分别，但是在forward或者backword中释放。
	 * @param len
	 * @param data
	 * @param err
	 */
	virtual bool on_forward( size_t len , const char * date , err_code &err , size_t& rlen , char ** rd ){return true;}
	virtual bool on_backward( size_t len , const char * data , err_code &err , size_t& rlen , char ** rd  ){return true;}
};

#endif // FILTERIO_H
